package cn.tedu;

public class Day02 {
    public static void main(String[] args) {
        //设定一个初始数字startValue,在只允许使用*2和-1操作的情况下来让startValue等于target
        int startValue = 3;//初始数字
        int target = 9;//目标数字
        int times = 0;
//        第一个版本
        times = test1(startValue, target);
//        times = test2(startValue, target);
        System.out.println(times);
    }

    public static int test1(int startValue, int target) {
        //定义一个次数来统计一共进行了多少次运算,也就是用了多少步
        int times = 0;

        /*
        1、只有startValue大于target的情况下才考虑-1操作
        2、预判[*2操作后剩余的步数加上*2本身需要增加一次步数]是否会比一直-1的操作步数更少,如果更少,则*2
         */
        while (startValue < target || (Math.abs(startValue * 2 - target) + 1 <= Math.abs(startValue - target))) {
            startValue = startValue * 2;
            times = times + 1;
            System.out.println(Math.abs(startValue * 2 - target) + 1 <= Math.abs(startValue - target));
            System.out.println("执行*");
        }

        //当startValue*2之后两者仍然不想等,则继续执行-1的操作
//        while (startValue != target) {
//            startValue = startValue - 1;
//            times = times + 1;
//            System.out.println("执行-");
//        }

        times = times + (startValue - target);
        return times;
    }

    public static int test2(int startValue, int target) {
        //逆向思维,相当于把原逻辑反转,变为目标数去接近初始数,条件变为/2和++
        int times = 0;
        // 当目标值不等于起始值时，循环执行操作
        while (target != startValue) {
            // 如果目标值小于起始值，返回两者的差值作为操作次数,因为在这种情况下,无论如何,起始数*2的操作都会离目标数越来越远
            if (target < startValue) {
                return times + startValue - target;
            }

            // 如果目标值是偶数，进行除以2的操作
            if (target % 2 == 0) {
                target /= 2;
            }
            // 如果目标值是奇数，进行加1的操作
            else {
                target++;
            }

            // 增加操作计数
            times++;
        }

        // 当 startValue 和 target 相等时，返回操作计数
        return times;
    }
}
